1.3 文件操作

🎯 学习目标

通过个人日记本项目,掌握Python文件操作和字符串处理

📝 项目预览:个人日记本

我们将创建一个能够记录、查看、搜索日记的程序,通过这个项目学习:

  • 文件的读写操作
  • 字符串处理和搜索
  • 异常处理的完整流程
  • 日期时间处理
  • 程序功能的模块化设计

1. 文件操作基础

什么是文件操作?

文件操作就是让程序能够读取写入计算机上的文件,就像我们用记事本记录文字一样。

打开文件

使用 open() 函数打开文件:

# 打开文件的基本语法
file = open("文件名", "模式", encoding="utf-8")

文件打开模式

模式 说明 例子
"r" 只读模式(默认) 读取文件内容
"w" 写入模式 创建新文件或清空原有内容
"a" 追加模式 在文件末尾添加内容
"r+" 读写模式 可以读取和写入

代码演示:基本文件操作

# 写入文件
with open("test.txt", "w", encoding="utf-8") as file:
    file.write("这是我的第一行文字\n")
    file.write("这是第二行文字\n")

# 读取文件
with open("test.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print("文件内容:")
    print(content)

2. with语句的优势

为什么使用with语句?

with 语句可以自动管理文件的打开和关闭,避免忘记关闭文件:

# 传统方式(容易忘记关闭文件)
file = open("test.txt", "r")
content = file.read()
file.close()  # 容易忘记这行

# 使用with语句(推荐)
with open("test.txt", "r") as file:
    content = file.read()
# 文件会自动关闭

3. 日记本中的文件操作

创建日记文件

import os

def create_diary_file():
    """创建日记文件"""
    filename = "my_diary.txt"
    
    # 检查文件是否存在
    if not os.path.exists(filename):
        with open(filename, "w", encoding="utf-8") as file:
            file.write("=== 我的个人日记 ===\n")
            file.write("=" * 30 + "\n\n")
        print(f"已创建日记文件: {filename}")
    else:
        print(f"日记文件已存在: {filename}")
    
    return filename

添加日记条目

import datetime

def add_diary_entry(filename, content):
    """添加日记条目"""
    # 获取当前时间
    current_time = datetime.datetime.now()
    timestamp = current_time.strftime("%Y年%m月%d日 %H:%M")
    
    # 写入文件
    with open(filename, "a", encoding="utf-8") as file:
        file.write(f"【{timestamp}】\n")
        file.write(content + "\n")
        file.write("-" * 40 + "\n\n")
    
    print("日记已保存!")

4. 字符串处理

字符串常用操作

# 字符串基本操作
text = "   Hello, World!   "

print("原始字符串:", repr(text))
print("去除空格:", repr(text.strip()))
print("转换为大写:", text.upper())
print("转换为小写:", text.lower())
print("替换内容:", text.replace("World", "Python"))
print("查找位置:", text.find("Hello"))
print("分割字符串:", text.split(","))

在日记本中的应用

def search_diary(filename, keyword):
    """搜索包含关键词的日记"""
    try:
        with open(filename, "r", encoding="utf-8") as file:
            content = file.read()
        
        # 统计关键词出现次数
        count = content.count(keyword)
        print(f"关键词 '{keyword}' 出现了 {count} 次")
        
        # 查找包含关键词的行
        lines = content.split('\n')
        for i, line in enumerate(lines):
            if keyword in line:
                print(f"第{i+1}行: {line.strip()}")
                
    except FileNotFoundError:
        print("日记文件不存在!")

5. 异常处理完整流程

完整的异常处理

def safe_file_operation(filename):
    """安全的文件操作"""
    try:
        # 尝试打开文件
        with open(filename, "r", encoding="utf-8") as file:
            content = file.read()
        return content
        
    except FileNotFoundError:
        print("错误:文件不存在!")
        return None
        
    except PermissionError:
        print("错误:没有文件访问权限!")
        return None
        
    except UnicodeDecodeError:
        print("错误:文件编码问题!")
        return None
        
    except Exception as e:
        print(f"未知错误: {e}")
        return None

日记本中的异常处理

def view_diary_safe(filename):
    """安全地查看日记"""
    try:
        with open(filename, "r", encoding="utf-8") as file:
            content = file.read()
        
        if content.strip():  # 检查内容是否为空
            print(content)
        else:
            print("日记本是空的")
            
    except FileNotFoundError:
        print("日记文件不存在,请先创建日记本")
    except Exception as e:
        print(f"读取日记时出错: {e}")

6. 日期时间处理

datetime模块的使用

import datetime

# 获取当前时间
now = datetime.datetime.now()
print("当前时间:", now)
print("年份:", now.year)
print("月份:", now.month)
print("日期:", now.day)
print("小时:", now.hour)
print("分钟:", now.minute)

# 格式化时间
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间:", formatted)

# 创建特定时间
def create_timestamp():
    """创建时间戳"""
    now = datetime.datetime.now()
    return now.strftime("【%Y年%m月%d日 %H:%M】")

7. 程序模块化设计

功能模块划分

一个好的日记本程序应该这样组织:

# diary_functions.py - 功能函数模块

def create_file():
    """创建日记文件"""
    pass

def add_entry():
    """添加日记"""
    pass

def view_entries():
    """查看日记"""
    pass

def search_entries():
    """搜索日记"""
    pass

# diary_main.py - 主程序模块

def main_menu():
    """主菜单"""
    pass

def main():
    """主程序"""
    pass

if __name__ == "__main__":
    main()

日记本中的模块化设计

import os
import datetime

class DiaryManager:
    """日记管理器类"""
    
    def __init__(self, filename="my_diary.txt"):
        self.filename = filename
        self.create_file_if_not_exists()
    
    def create_file_if_not_exists(self):
        """如果文件不存在则创建"""
        if not os.path.exists(self.filename):
            with open(self.filename, "w", encoding="utf-8") as file:
                file.write("=== 我的个人日记 ===\n")
                file.write("=" * 30 + "\n\n")
    
    def add_entry(self, content):
        """添加日记条目"""
        timestamp = datetime.datetime.now().strftime("【%Y年%m月%d日 %H:%M】")
        
        with open(self.filename, "a", encoding="utf-8") as file:
            file.write(f"{timestamp}\n")
            file.write(content + "\n")
            file.write("-" * 40 + "\n\n")
        
        print("日记保存成功!")

📋 个人日记本完整代码解析

让我们看看项目中的关键代码:

import os
import datetime

def create_diary_file():
    """创建日记文件"""
    filename = "my_diary.txt"
    
    if not os.path.exists(filename):
        with open(filename, "w", encoding="utf-8") as file:
            file.write("=== 我的个人日记 ===\n")
            file.write(f"创建时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            file.write("=" * 30 + "\n\n")
        print(f"已创建日记文件: {filename}")
    
    return filename

def add_new_entry(filename):
    """添加新日记"""
    print("\n=== 写新日记 ===")
    
    # 获取用户输入
    content = input("请输入日记内容: ")
    
    if content.strip():  # 检查是否输入了内容
        timestamp = datetime.datetime.now().strftime("【%Y年%m月%d日 %H:%M】")
        
        try:
            with open(filename, "a", encoding="utf-8") as file:
                file.write(f"{timestamp}\n")
                file.write(content + "\n")
                file.write("-" * 40 + "\n\n")
            print("日记保存成功!")
        except Exception as e:
            print(f"保存失败: {e}")
    else:
        print("内容为空,取消保存")

def main():
    """主程序"""
    diary_file = create_diary_file()
    
    while True:
        print("\n请选择功能:")
        print("1. 写新日记")
        print("2. 查看日记")
        print("3. 退出")
        
        choice = input("请输入选择 (1-3): ")
        
        if choice == '1':
            add_new_entry(diary_file)
        elif choice == '2':
            view_diary_entries(diary_file)
        elif choice == '3':
            print("感谢使用日记本,再见!")
            break
        else:
            print("无效选择!")

if __name__ == "__main__":
    main()

🎯 学习要点总结

  1. 文件操作open(), read(), write(), close() 的使用
  2. with语句:自动管理文件资源
  3. 字符串处理strip(), split(), find(), replace() 等方法
  4. 异常处理:完整的 try-except 错误处理流程
  5. 日期时间datetime 模块的使用和时间格式化
  6. 模块化设计:合理的函数划分和程序结构
  7. 文件检查os.path.exists() 检查文件是否存在
  8. 编码处理:使用 encoding='utf-8' 处理中文

💡 练习建议

  1. 运行代码:打开 code/第一阶段/1.3_个人日记本.py 体验功能
  2. 添加功能:尝试添加搜索、统计、备份等功能
  3. 改进界面:让菜单更友好,增加颜色提示
  4. 错误处理:完善各种异常情况的处理
  5. 数据持久化:尝试使用JSON格式存储日记

🚀 文件操作的重要性

  1. 数据持久化:程序关闭后数据不会丢失
  2. 数据交换:不同程序之间可以通过文件共享数据
  3. 日志记录:记录程序运行状态和用户操作
  4. 配置存储:保存程序设置和用户偏好

🚀 下一步

完成这个项目后,你已经掌握了Python编程的基础知识,可以继续学习:

  • 第二阶段:数据处理与分析,使用NumPy和Pandas
  • 第三阶段:机器学习基础,使用Scikit-learn

记住:文件操作是程序与外部世界沟通的桥梁,掌握好文件操作能让你的程序更实用!


学习愉快!多练习文件操作,这是编程中非常实用的技能!

« 上一篇 1.2 函数与模块 下一篇 » 2.1 NumPy基础